#include <pthread.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <thread>
#include <vector>

#include "lock.hpp"
using namespace std;

#define NUM 2

int g_val = 0;

void *ThreadRoutine(void *args) {
  pthread_mutex_t *lock = static_cast<pthread_mutex_t *>(args);
  while (true) {
    usleep(1000);
    pthread_mutex_lock(lock);
    pthread_mutex_lock(lock);
    if (g_val > 0) {
      g_val--;
    } else {
      break;
    }
  }
  printf("I am Thread-%d , quit ... \n", (int)pthread_self() % 1000);
  return nullptr;
}

int main() {
  vector<pthread_t> tids;
  pthread_mutex_t lock;
  pthread_mutex_init(&lock, nullptr);
  for (int i = 0; i < NUM; ++i) {
    pthread_t tid;
    pthread_create(&tid, nullptr, ThreadRoutine, &lock);
    tids.push_back(tid);
  }

  for (size_t i = 0; i < tids.size(); ++i) {
    sleep(1);
    if (pthread_join(tids[i], nullptr)) {
      cout << "join fail" << endl;
    }
  }
  pthread_mutex_destroy(&lock);
  return 0;
}

// int g_val = 700;
// pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;  // 定义一把全局的锁
// class threadData {
//  public:
//   threadData(const int number, pthread_mutex_t *mutex) {
//     threadname_ = "Thread_" + to_string(number);
//   }

//  public:
//   string threadname_;
//   pthread_t tid_;
// };

// void *threadRoutine(void *args) {
//   threadData *td = static_cast<threadData *>(args);

//   td->tid_ = pthread_self();
//   while (true) {
//     {
//       LockGuard lockguard(&lock);  // 实例化一个临时锁对象
//       if (g_val > 0) {
//         usleep(100);
//         printf("I am %s , the g_val = %3d\n", td->threadname_.c_str(),
//         g_val); g_val--;
//       } else
//         break;
//     }  // 控制锁对象的生命周期
//     usleep(50);
//   }
//   delete td;
//   return nullptr;
// }

// int main() {
//   vector<pthread_t> tids;

//   for (size_t i = 0; i < NUM; ++i) {
//     pthread_t tid;
//     threadData *td = new threadData(i, &lock);
//     pthread_create(&tid, nullptr, threadRoutine, td);

//     tids.push_back(tid);
//   }

//   for (size_t i = 0; i < tids.size(); ++i) {
//     pthread_join(tids[i], nullptr);
//   }
//   return 0;
// }
